筆記目錄

Skip to content

在 ASP.NET Core 實作 GDPR

TLDR

  • GDPR 要求網站必須告知使用者 Cookie 使用情況,並在使用者同意前限制非必要 Cookie 的寫入。
  • ASP.NET Core 透過 CookiePolicyOptionsUseCookiePolicy 中介軟體 (Middleware) 來管理 Cookie 同意機制。
  • 若需強制使用者同意後才能寫入非必要 Cookie,需將 CheckConsentNeeded 設定為 true
  • 標記為 IsEssential = true 的 Cookie,即使使用者未同意也能正常寫入,適用於網站運作所必需的資料。
  • 實作時可利用 ITrackingConsentFeature 檢查使用者是否已同意追蹤,並透過 CreateConsentCookie() 產生同意標記。

GDPR 實作核心概念

GDPR 要求網站針對歐盟個人的資料及隱私進行規範。在實作 Cookie 同意橫幅 (Consent Banner) 時,常見的處理邏輯如下:

  • 告知使用者網站使用 Cookie 的情況,並提供隱私權政策頁面連結。
  • 關閉提示訊息的處理:
    • 僅關閉:畫面上暫時隱藏,重新整理後會再次出現。
    • 同意:寫入同意標記 (Flag) 的 Cookie,後續不再顯示提示,並依此標記決定是否寫入其他非必要 Cookie。
  • 預防性保護:在使用者同意前,應停止寫入非必要性的 Cookie。

ASP.NET Core 的 GDPR 實作方式

ASP.NET Core 提供了內建的機制來處理 Cookie 同意流程,主要透過 CookiePolicyOptions 進行設定。

設定 CookiePolicyOptions

Program.cs 中設定 CookiePolicyOptions,並啟用 UseCookiePolicy 中介軟體。

csharp
builder.Services.Configure<CookiePolicyOptions>(options => {
    // 設定為 true 時,系統會檢查使用者是否已同意,未同意前限制非必要 Cookie 寫入
    options.CheckConsentNeeded = context => true;

    options.MinimumSameSitePolicy = SameSiteMode.None;
});

// ...其他程式碼...

app.UseCookiePolicy(); // Cookie 相關 Middleware

_CookieConsentPartial.cshtml 中,利用 ITrackingConsentFeature 判斷是否顯示橫幅,並處理同意按鈕的點擊事件。

什麼情況下會遇到這個問題:當你需要根據使用者的同意狀態,動態顯示或隱藏 Cookie 提示橫幅時。

html
@using Microsoft.AspNetCore.Http.Features

@{
    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
    var showBanner = !consentFeature?.CanTrack ?? false;
    var cookieString = consentFeature?.CreateConsentCookie();
}

@if (showBanner) {
    <div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert">
        Use this space to summarize your privacy and cookie use policy. <a asp-page="/Privacy">Learn More</a>.
        <button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
            <span aria-hidden="true">Accept</span>
        </button>
    </div>
    <script>
        (function () {
            var button = document.querySelector("#cookieConsent button[data-cookie-string]");
            button.addEventListener("click", function (event) {
                document.cookie = button.dataset.cookieString;
            }, false);
        })();
    </script>
}

有些 Cookie 是網站正常運作所必需的(例如購物車或身分驗證),即使使用者尚未同意隱私政策,這些 Cookie 仍需寫入。

什麼情況下會遇到這個問題:當網站有部分功能(如登入狀態)依賴 Cookie,且該功能在使用者點擊「同意」前就必須運作時。

csharp
Response.Cookies.Append("name", "value", new CookieOptions {
   IsEssential = true // 將此 Cookie 標記為必要的,不受同意機制限制
});

異動歷程

  • 2022-10-27 初版文件建立。